[libcxx] Add build/test support for the externally threaded libc++abi variant Differential revision: https://reviews.llvm.org/D27576 Reviewers: EricWF git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@290889 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/CMakeLists.txt b/CMakeLists.txt index 21d7ded..803e8f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt 
@@ -221,14 +221,21 @@  " when LIBCXX_ENABLE_THREADS is also set to OFF.")  endif()   -if(LIBCXX_HAS_PTHREAD_API AND NOT LIBCXX_ENABLE_THREADS) - message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON" - " when LIBCXX_ENABLE_THREADS is also set to ON.") +if(NOT LIBCXX_ENABLE_THREADS) + if(LIBCXX_HAS_PTHREAD_API) + message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON" + " when LIBCXX_ENABLE_THREADS is also set to ON.") + endif() + if(LIBCXX_HAS_EXTERNAL_THREAD_API) + message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON" + " when LIBCXX_ENABLE_THREADS is also set to ON.") + endif()  endif()   -if(LIBCXX_HAS_EXTERNAL_THREAD_API AND NOT LIBCXX_ENABLE_THREADS) - message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON" - " when LIBCXX_ENABLE_THREADS is also set to ON.") +if(LIBCXX_HAS_PTHREAD_API AND LIBCXX_HAS_EXTERNAL_THREAD_API) + message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API" + "and LIBCXX_HAS_PTHREAD_API cannot be both" + "set to ON at the same time.")  endif()    # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE 
diff --git a/include/__threading_support b/include/__threading_support index 0064c7d..b1eaf25 100644 --- a/include/__threading_support +++ b/include/__threading_support 
@@ -67,7 +67,11 @@  typedef pthread_cond_t __libcpp_condvar_t;  #define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER   -// THread ID +// Execute once +typedef pthread_once_t __libcpp_exec_once_flag; +#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT + +// Thread id  typedef pthread_t __libcpp_thread_id;    // Thread @@ -110,7 +114,17 @@  _LIBCPP_THREAD_ABI_VISIBILITY  int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);   -// Thread ID +// Execute once +_LIBCPP_THREAD_ABI_VISIBILITY +int __libcpp_execute_once(__libcpp_exec_once_flag *flag, + void (*init_routine)(void)); + +// Thread id +#if defined(__APPLE__) && !defined(__arm__) +_LIBCPP_THREAD_ABI_VISIBILITY +mach_port_t __libcpp_thread_get_port(); +#endif +  _LIBCPP_THREAD_ABI_VISIBILITY  bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);   @@ -145,7 +159,7 @@  void *__libcpp_tls_get(__libcpp_tls_key __key);    _LIBCPP_THREAD_ABI_VISIBILITY -void __libcpp_tls_set(__libcpp_tls_key __key, void *__p); +int __libcpp_tls_set(__libcpp_tls_key __key, void *__p);    #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \  defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD) @@ -221,6 +235,19 @@  return pthread_cond_destroy(__cv);  }   +// Execute once +int __libcpp_execute_once(__libcpp_exec_once_flag *flag, + void (*init_routine)(void)) { + return pthread_once(flag, init_routine); +} + +// Thread id +#if defined(__APPLE__) && !defined(__arm__) +mach_port_t __libcpp_thread_get_port() { + return pthread_mach_thread_np(pthread_self()); +} +#endif +  // Returns non-zero if the thread ids are equal, otherwise 0  bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)  { @@ -276,9 +303,9 @@  return pthread_getspecific(__key);  }   -void __libcpp_tls_set(__libcpp_tls_key __key, void *__p) +int __libcpp_tls_set(__libcpp_tls_key __key, void *__p)  { - pthread_setspecific(__key, __p); + return pthread_setspecific(__key, __p);  }    #endif // _LIBCPP_HAS_THREAD_API_PTHREAD 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index edebaee..d174ec7 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt 
@@ -55,18 +55,20 @@  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg  @ONLY)   +set(LIBCXX_TEST_DEPS "") +  if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) - set(experimental_dep cxx_experimental) + set(LIBCXX_TEST_DEPS cxx_experimental)  endif()    if (LIBCXX_HAS_EXTERNAL_THREAD_API) - set(external_threads_dep cxx_external_threads) + list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)  endif()    add_lit_testsuite(check-cxx  "Running libcxx tests"  ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS cxx ${experimental_dep} ${external_threads_dep}) + DEPENDS cxx ${LIBCXX_TEST_DEPS})    add_custom_target(check-libcxx DEPENDS check-cxx)   
diff --git a/test/libcxx/test/config.py b/test/libcxx/test/config.py index e5f4173..dd90e7a 100644 --- a/test/libcxx/test/config.py +++ b/test/libcxx/test/config.py 
@@ -579,10 +579,6 @@  self.cxx.link_flags += [abs_path]  else:  self.cxx.link_flags += ['-lc++'] - # This needs to come after -lc++ as we want its unresolved thread-api symbols - # to be picked up from this one. - if self.get_lit_bool('libcxx_external_thread_api', default=False): - self.cxx.link_flags += ['-lc++external_threads']    def configure_link_flags_abi_library(self):  cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi') @@ -611,6 +607,8 @@  'C++ ABI setting %s unsupported for tests' % cxx_abi)    def configure_extra_library_flags(self): + if self.get_lit_bool('cxx_ext_threads', default=False): + self.cxx.link_flags += ['-lc++external_threads']  self.target_info.add_cxx_link_flags(self.cxx.link_flags)    def configure_color_diagnostics(self): 
diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in index 741e9c8..c89af09 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in 
@@ -28,7 +28,7 @@  config.use_libatomic = "@LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@"    config.libcxxabi_shared = "@LIBCXXABI_ENABLE_SHARED@" -config.libcxx_external_thread_api = "@LIBCXX_HAS_EXTERNAL_THREAD_API@" +config.cxx_ext_threads = "@LIBCXX_HAS_EXTERNAL_THREAD_API@"    # Let the main config do the real work.  config.loaded_site_config = True